Running tests and builds will sometimes create either a Python
`__pycache__` directory or a Meson `.wraplock` file. Probably a good
idea to ignore those so they never get included upstream.
Sebastian Keller [Mon, 27 Apr 2026 20:53:59 +0000 (22:53 +0200)]
messageTray: Don't try to focus destroyed actor
When `ungrabFocus()` is called after hiding a notification, the previous
focus actor might have already been destroyed and trying to focus it
will trigger a gjs error.
shell/app: Be extra careful when applying GPU environment
We get the environment from SwitcherooControl as an array of
key-value pairs. When applying it, we loop over the array in pairs,
assuming that every key has a value.
While this is the expected format, it does not hurt to be defensive
against possible bugs in the service, so explicitly check that both
key and value are non-NULL before applying them.
Milan Crha [Wed, 22 Apr 2026 15:04:28 +0000 (17:04 +0200)]
endSessionDialog: Recognize scheduled updates in the Power Off dialog
The Power Off dialog should show a checkbox to install (or not) a scheduled
update, but I missed it in my previous https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4185
animation: Prevent spinner animation from resetting
Currently, the search status spinner animation restarts on every
single keystroke while a search is in progress. This occurs because
redundant calls to `play()` replace the previous content and restart
the animation from the beginning.
This commit fixes this by ignoring redundant `play()` and `stop()` calls.
Sebastian Keller [Tue, 21 Apr 2026 11:59:51 +0000 (13:59 +0200)]
autorunManager: Connect to the correct notification signal
The signal is called `activated`. This was triggering an error and
preventing the notification from showing up when connecting an USB
drive with autorun enabled.
Milan Crha [Mon, 20 Apr 2026 10:22:48 +0000 (12:22 +0200)]
endSessionDialog: Prepare updates also in the "Restart & Install" dialog
The current code expects a checkbox to confirm update installation to be
present, but when the updates are already scheduled, it did not confirm
the actual user action for the update, aka to reboot the machine, instead
of using the previously set update action, which could be Power Off.
Milan Crha [Tue, 21 Apr 2026 15:38:10 +0000 (17:38 +0200)]
endSessionDialog: Differentiate between prepared and scheduled updates again
The prepared updates are those downloaded, while the scheduled updates
are those ready to be installed the next machine boot. The previous
gnome-software change with its OfflineUpdates D-Bus interface did not
count with it and claimed all the updates as scheduled, even when they
had been only prepared. This makes it work again by utilizing the
gnome-software changes.
screencastService: Add rate control to VA-API H.264 pipelines
The vah264enc and vah264lpenc pipelines do not specify any rate control
parameters, causing the encoder to use its default bitrate. At 4K this
results in ~12 Mbit/s recordings — roughly 18x larger than the VP8
software fallback (~630 kbit/s) with no visible quality benefit for
typical screencast content.
All other pipelines in the PIPELINES array constrain quality explicitly:
openh264enc uses qp-max=26/qp-min=26, vp8enc uses max-quantizer=17 and
buffer-size=20000. Only the two VA-API pipelines are left unconstrained.
Add rate-control=vbr bitrate=2048 target-percentage=50 to both VA-API
pipelines. This produces ~1 Mbit/s average / 2 Mbit/s peak, which is
comparable to what the other encoders produce and works across both AMD
(which lacks CQP) and Intel VA-API implementations.
Before (4K, 5s recording): 11688 kb/s, 7.2 MB
After (4K, 5s recording): 2472 kb/s, 1.6 MB
dash: Use connectObject to track signal connection to global objects
While the dash is never destroyed in vanilla gnome shell, various
extensions (such as dash-to-dock) are using this code, potentially for
every monitor.
And so we should make sure that the signals are disconnected when the
actor is destroyed.
appFavorites: Move installed-changed where it belongs
In the dash we are monitoring the installed applications and reload the
favorites, while this is not something that is related to the dash per
se, and if the AppFavorites is used to track the favorites elsewhere it
would not be updated when new favorite apps are installed.
So move the logic to AppFavorites, that will now emit a changed
event whenever any favorite changed.
appFavorites: Only emit :changed signal on changes
We were emitting the :changed signal on every setting or app-filter
change even though the actual favorites list might not have changed.
So now every time it's relevant, check if something is changed before
emitting the :changed signal.
We do a deep check of the app IDs as potentially an app could have
been removed while another is being installed during the same update
window, and the length of the IDs list wouldn't change.
When the user uses a screen reader and navigates through the
dash, each element is notified as two: one panel with no label,
and then a button with the application name as the label.
This is because each icon has the BUTTON role, but is inside a
container with the PANEL role, so each time the focus changes
from an icon to the next, there is a change in the container,
so the screen reader notifies this. But that container is
useless for the screen reader. The container always read its
label because the label_actor property is set.
In mpris we only emit "player-added" for players that can actually play,
but during NotificationBox and MessageList initialization we add them all,
including those not having being technically added.
And this may be a problem when locking the screen, since we do not want
players to show if they cannot play.
So, be consistent and expose publicly only the players that can play
fthx [Mon, 16 Feb 2026 09:41:58 +0000 (09:41 +0000)]
dash: Disconnect overview signals on destroy
While we never destroy the dash ourselves, extensions that replace it
might, so better disconnect the signals properly instead of leaking
the handlers in that case.
Ramez Medhat [Sat, 28 Mar 2026 15:14:15 +0000 (17:14 +0200)]
screenshot: Snap cursor to the center of the handle on press
When dragging the screenshot area handle from the outer sides, it is
currently impossible to move them to the edges or corners of the screen,
as the cursor is constrained to the monitor.
Fix this by snapping the cursor to the center of the handle when starting
the resize operation.
Sebastian Keller [Sat, 11 Apr 2026 13:43:05 +0000 (15:43 +0200)]
signalTracker: Add debug function to get all signal trackers
Signal trackers have been the source of difficult to identify leaks in
the past. Having access to the list of all active signal trackers at run
time without having to modify and rebuild gnome-shell can be very
valuable in identifying the source of these leaks, especially since the
steps required to trigger a leak might not always be obvious.
Sebastian Keller [Sat, 11 Apr 2026 13:02:12 +0000 (15:02 +0200)]
environment: Disconnect from transitions when stopped
Transitions don't emit a 'destroy' signal which would be used by the
SignalTracker to automatically clean up, leading to all transitions
being leaked until session shutdown.
Avoid this by manually disconnecting them when stopped.
Fixes: 240aa910d ("environment: Ignore animation events after shutdown")
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4168>
Florian Müllner [Tue, 31 Mar 2026 19:39:05 +0000 (21:39 +0200)]
portalHelper: Set up accels from app
Setting up accels is an app action, so doing it from the app is
a more natural place than repeating it for each window (even if
the common case is a single window for the entire process lifetime).
sessionMode: Enable the networkAgent within the unlock-dialog
This ensures that selecting a password-protected
Wi-Fi network in quicksettings behaves the same
on both the initial gdm screen (before any user
has logged in, as enabled already in 4440a8210b456923678facd434ef8a23d48f63b6)
and when the screen has been locked by an already logged-in user.
Jonas Ådahl [Mon, 23 Mar 2026 12:26:51 +0000 (13:26 +0100)]
st/texture-cache: Add missing error reporting
st_texture_cache_load_file_sync_to_cogl_texture() loads a file into a
texture, but if pixbuf_to_st_content_image() failed, it'd return that it
failed, but wouldn't set an error, which would cause a null pointer
dereference when attempting to log the error message in the caller. Fix
this by setting an error on all error paths.
Sebastian Keller [Thu, 26 Mar 2026 18:29:44 +0000 (19:29 +0100)]
keyboard: Ensure minimum height of the OSK always fits on screen
At very low resolutions, 1/3 of the screen height might not be enough
for the minimum height of the OSK, causing some keys to get pushed out
of the screen. This now ensures the height is always at least the
minimum height, but only up to 1/2 of the screen to avoid situations
where the OSK would cover the whole screen preventing any other
interaction.
Peter Hutterer [Tue, 24 Mar 2026 00:37:36 +0000 (10:37 +1000)]
tools/toolbox: Ignore missing config files
The config file is created by our own create-toolbox.sh script which
sets the DEFAULT_TOOLBOX name. But for toolboxes created directly
that file doesn't exist, so let's skip over that (and thus require
the toolbox name to be given on the commandline or via an env var).
Sebastian Keller [Tue, 17 Mar 2026 03:21:09 +0000 (04:21 +0100)]
quickSettings: Consider menu width when calculating its preferred height
Previously the width of a menu was ignored when calculating its
preferred height. This was leading to line wrapped text never being
wrapped in these calculations and thus the menu being assumed to be
shorter than it actually ends up when allocated with line wrapping.
Sebastian Keller [Tue, 17 Mar 2026 01:51:44 +0000 (02:51 +0100)]
quickSettings: Adjust menu width using contraints instead of CSS
The width of the overlay actor for quick settings menus was as wide as
the whole box pointer and the menus placed inside the overlay actor were
then adjusted with CSS margins to have the same width and spacing as the
other elements.
This meant that in `QuickSettingsLayout` the width of the overlay actor
would have to be dependent on the size of a parent actor rather than the
associated container. In the next commit we are however going to need to
use the correct width, so this commit changes the width of the overlay
actor to be the same as other actors in the grid.
This also avoids the need to use CSS to adjust the width and horizontal
placement.
Sebastian Keller [Sat, 21 Mar 2026 22:38:16 +0000 (23:38 +0100)]
st/viewport: Include padding in paint volume origin calculation
In the presence of adjustments, the paint volume had its size adjusted
for the padding of the viewport, but not its origin. This was leading to
scrollable viewports with a padding having their paint volumes shifted
too far to the left causing some artifacts on the right when scrolling.
One place where this could be observed was the window list in looking
glass.
This now correctly adjusts the origin, simplifies the code and moves it
into the only condition where the adjustment is needed.
DaPigGuy [Fri, 20 Mar 2026 01:48:13 +0000 (18:48 -0700)]
shell: Fix overcounting of misc. symbols for password strength
There was previously a branch for lowercase symbols that was removed.
Lowercase symbols should not count as miscellaneous symbols, which
increase the password strength.
Maksim Mazko [Mon, 2 Mar 2026 17:44:56 +0000 (20:44 +0300)]
status/keyboard: Preserve MRU order while IBus is disabled
In password fields, IBus sources are temporarily disabled and a backup
of the MRU list is created. If the user switches layouts in that state,
the active MRU list is updated, but the backup is not.
When IBus is enabled again, the stale backup is restored and the order
the user just selected is lost. Sync the backup on interactive source
switches while IBus is disabled, so the MRU order stays consistent.
Florian Müllner [Thu, 12 Mar 2026 10:32:40 +0000 (11:32 +0100)]
boxpointer: Properly update arrow side when requested
Boxpointer tracks both the "user arrow side", which is the side
that was explicitly specified, and the "arrow side", which is the
actual side that may have been flipped due to space constraints.
However the former currently always keeps tracking the side that
was specified at construction time, even if it is explicitly
changed with `updateArrowSide()`.
That means that on allocation, the arrow side is reverted to its
original value again, unless the flip calculation happens to turn
it into the intended value.
This is unexpected, so update both current and intended arrow side
when updating the arrow side.
Florian Müllner [Fri, 13 Mar 2026 11:47:48 +0000 (12:47 +0100)]
boxpointer: Queue relayout after updating arrow side
We currently queue a repaint after setting a new arrow side, but
that seems insufficient - moving the arrow from top/bottom to the
left/right for example may very well affect the layout, plus the
arrow may need flipping due to size constraints (which happens
on allocation).
Sebastian Keller [Fri, 13 Mar 2026 00:27:29 +0000 (01:27 +0100)]
systemActions: Fix initial visibility of logout action
When `_updateLogout()` is called on login, the AccountsService user
might not have been loaded yet. This would have resulted in all values
being null/false, including `local_account`. Since `!localAccount` is
one of the cases where the action is available, this would have wrongly
resulted in the item being shown when not intended to be shown. But only
until something triggers another call of `_updateLogout()`, such as
locking/unlocking the session.
Daniel Rusek [Thu, 12 Mar 2026 10:34:26 +0000 (10:34 +0000)]
data: Re-add old Passwords and Keys desktop name
Seahorse desktop file name was changed in upstream, but the new release
was delayed. This caused Seahorse to be outside the Utilities folder in
newer distributions, which is not correct.
The new Seahorse version should be out soon, so reverting the new name
is not a good idea. Instead, the old name should be added back.
Florian Müllner [Wed, 11 Mar 2026 21:37:20 +0000 (22:37 +0100)]
main: Also respect --force-animations flag in remote sessions
When commit 33d3a6564 added support for the --force-animations flag,
it explicitly excluded remote sessions.
There has been some interest in enabling the flag for remote sessions
as well recently, and as nobody seems to remember why they were
excluded, do just that.
When an app folder is open and its panel is shown, there are
three main elements: the folder name, the list of apps, and the
Edit togglebutton. By default, the user can use TAB to jump
between the app icons and the Edit togglebutton, but when the
togglebutton is checked, the folder name becomes editable and
the focus jumps to it.
Unfortunately, if the user goes out of the editable name with
TAB, the focus only cycles between the Edit togglebutton and
the app icons, never landing over the editable folder name (which
remains editable until the Edit togglebutton is unchecked).
This patch fixed this, making the editable folder name focusable
when using TAB, as expected, when the Edit togglebutton is
checked.
appDisplay: Fix accessibility for application folders
Currently, application folders have a `checkbutton` role, which
is confusing for the user because it's not something that
changes its checked status, but a button that opens the contents
of the folder. Also, the only indication that this is a folder
and not a "normal" application is that role, which means that an
user must know that pushbuttons are applications and checkbuttons
are folders, which is confusing.
This patch fixes this by adding the "expandable" accessible
state to the folder button, thus notifying the user that it is
an element with extra elements inside.
It also adds the folder name and the type as the full container
label when opening a folder, thus ensuring that the user knows
where they are.
Florian Müllner [Thu, 5 Mar 2026 15:22:41 +0000 (16:22 +0100)]
appDisplay: Stop using toggle-mode with folder icons
This is essentially a left-over from the original folder design, dating
all the way back to commit 6e3e2d9 in 2013.
It no longer makes much sense with the current design iteration, where
we pretend that the icon pops out of the grid and becomes the dialog
(i.e. we hide the icon and zoom out the dialog from its position).
messageTray: Avoid notification double destruction after activation
The activation handler of a notification may indirectly have already
destroyed it before `activate()` continues and tries to destroy it.
This happened for example in the `FdoNotificationDaemon` activation
handler when no default actions are specified, which ends up calling
`destroyNonResidentNotifications()`.
Another case where this could happen is the `WindowAttentionHandler`
which activates the window and upon activation of the window destroys
the entire notification source, which also destroys the notification.
Florian Müllner [Thu, 12 Feb 2026 12:50:47 +0000 (13:50 +0100)]
layout: Wait for backgrounds to load, even when interrupted
We no longer get stuck when a background manager is destroyed during
the startup animation, but we now resolve before the new backgrounds
have been loaded.
Address this by keeping the returned promise around until it is fulfilled,
and only resolve it after backgrounds were loaded successfully.
Florian Müllner [Tue, 10 Feb 2026 14:30:46 +0000 (15:30 +0100)]
layout: Reject promise if background loading is interrupted
Currently if a background manager is destroyed while we are waiting
for the background to load, the corresponding promise never resolves.
To prevent this from happening (and the startup animation getting
stuck as a result), guard the loading operation with a cancellable
and reject the promise when it is cancelled.